package com.jintian.smart.kernel.orm.controller;

import com.jintian.smart.kernel.core.domain.PageQuery;
import com.jintian.smart.kernel.core.orm.ISimpleCondition;
import com.jintian.smart.kernel.orm.service.IService;
import org.beetl.sql.core.SQLManager;
import org.beetl.sql.core.page.PageResult;

import java.io.Serializable;
import java.util.List;
import java.util.Map;


public interface IEntityController<T, Q extends ISimpleCondition> {
    IService<T> getEntityService();

    default SQLManager getSQLManager() {
        return getEntityService().getEntityMapper().getSQLManager();
    }

    /**
     * 简单分页查询
     *
     * @param request
     * @return
     */
    default PageResult<T> simpleQuery(PageQuery<T, Q> request) {
        return getEntityService().simpleQuery(request);
    }
//
//    default IPage<T> simplePage(PageDTO<T, Q> request) {
//        return PageUtils.getPage(request, getEntityService().simpleQuery(request));
//    }

    /**
     * 根据 ID 查询
     *
     * @param id 主键ID
     */
    default T get(Serializable id) {
        return getEntityService().getById(id);
    }

    /**
     * 创建实例
     *
     * @return
     */
    default T create() {
        return getEntityService().create(null);
    }

    /**
     * 创建实例，如果默认值表达式包含宿主参数，需传入宿主参数值
     *
     * @return
     */
    default T create(Map<String, Object> params) {
        return getEntityService().create(params);
    }

    /**
     * 通用插入，插入一个实体对象到数据库，所以字段将参与操作，除非你使用ColumnIgnore注解 SqlResource
     *
     * @param entity 实体对象
     */
    default Integer save(T entity) {
        return getEntityService().save(entity);
    }

    /**
     * 根据主键更新对象，所以属性都参与更新。也可以使用主键ColumnIgnore来控制更新的时候忽略此字段
     *
     * @param entity
     * @return
     */
    default Integer update(T entity) {
        return getEntityService().updateById(entity);
    }

    /**
     * 根据主键更新对象，只有不为null的属性参与更新
     *
     * @return
     */
    default Integer updateTemplate(T template) {
        return getEntityService().updateTemplateById(template);
    }

    /**
     * 只更新Map包含的属性，支持空值更新。必须包含主键属性和版本属性(如果存在)
     *
     * @param template
     * @return
     */
    default boolean updateTemplate2(Map<String, Object> template) {
        return getEntityService().updateTemplate2ById(template);
    }

    /**
     * 存在更新记录，否插入一条记录
     *
     * @param entity 实体对象
     */
    default boolean upsert(T entity) {
        return getEntityService().saveOrUpdate(entity);
    }

    /**
     * 存在更新记录(只有不为null的属性参与更新)，否插入一条记录
     *
     * @param entity 实体对象
     */
    default boolean upsertTemplate(T entity) {
        return getEntityService().saveOrUpdateTemplate(entity);
    }

    /**
     * 删除（根据ID 批量删除），支持逻辑删除
     *
     * @param idList 主键ID列表
     */
    default int[] _deleteByIds(List<? extends Serializable> idList) {
        return getEntityService().deleteByIds(idList);
    }

    /**
     * 根据 ID 删除，支持逻辑删除
     *
     * @param id 主键ID
     */
    default Integer deleteById(Serializable id) {
        return getEntityService().deleteById(id);
    }
}
